// --------------------------------------------------------------------------------
// The MIT License (MIT)
//
// Copyright (c) 2014 Shiny Development
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// --------------------------------------------------------------------------------

#import <UIKit/UIKit.h>
#import "SDStatusBarOverriderPost8_3.h"

/* Generated by RuntimeBrowser.
 Image: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/UIKit.framework/UIKit
 */

typedef struct {
  char boolitemIsEnabled[26];
  char timeString[64];
  int gsmSignalStrengthRaw;
  int gsmSignalStrengthBars;
  char serviceString[100];
  char serviceCrossfadeString[100];
  char serviceImages[2][100];
  char operatorDirectory[1024];
  unsigned int serviceContentType;
  int wifiSignalStrengthRaw;
  int wifiSignalStrengthBars;
  unsigned int dataNetworkType;
  int batteryCapacity;
  unsigned int batteryState;
  char batteryDetailString[150];
  int bluetoothBatteryCapacity;
  int thermalColor;
  unsigned int thermalSunlightMode : 1;
  unsigned int slowActivity : 1;
  unsigned int syncActivity : 1;
  BOOL activityDisplayId[256];
  unsigned int bluetoothConnected : 1;
  unsigned int displayRawGSMSignal : 1;
  unsigned int displayRawWifiSignal : 1;
  unsigned int locationIconType : 1;
  unsigned int quietModeInactive : 1;
  unsigned int tetheringConnectionCount;
} StatusBarRawData;

typedef struct {
  char booloverrideItemIsEnabled[26];
  unsigned int overrideTimeString : 1;
  unsigned int overrideGsmSignalStrengthRaw : 1;
  unsigned int overrideGsmSignalStrengthBars : 1;
  unsigned int overrideServiceString : 1;
  unsigned int overrideServiceImages : 2;
  unsigned int overrideOperatorDirectory : 1;
  unsigned int overrideServiceContentType : 1;
  unsigned int overrideWifiSignalStrengthRaw : 1;
  unsigned int overrideWifiSignalStrengthBars : 1;
  unsigned int overrideDataNetworkType : 1;
  unsigned int disallowsCellularDataNetworkTypes : 1;
  unsigned int overrideBatteryCapacity : 1;
  unsigned int overrideBatteryState : 1;
  unsigned int overrideBatteryDetailString : 1;
  unsigned int overrideBluetoothBatteryCapacity : 1;
  unsigned int overrideThermalColor : 1;
  unsigned int overrideSlowActivity : 1;
  unsigned int overrideActivityDisplayId : 1;
  unsigned int overrideBluetoothConnected : 1;
  unsigned int overrideDisplayRawGSMSignal : 1;
  unsigned int overrideDisplayRawWifiSignal : 1;
  StatusBarRawData values;
} StatusBarOverrideData;

@class UIStatusBarServerClient;

@interface UIStatusBarServer : NSObject  {
  UIStatusBarServerClient *_statusBar;
  struct __CFRunLoopSource { } *_source;
}

@property(retain) UIStatusBarServerClient * statusBar;

+ (unsigned int)_serverPort;
+ (void)runServer;
+ (id)getDoubleHeightStatusStringForStyle:(long long)arg1;
+ (bool)getGlowAnimationStateForStyle:(long long)arg1;
+ (int)getStyleOverrides;
+ (StatusBarOverrideData *)getStatusBarOverrideData;
+ (const StatusBarRawData*)getStatusBarData;
+ (void)permanentizeStatusBarOverrideData;
+ (void)postStatusBarOverrideData:(StatusBarOverrideData*)arg1;
+ (void)postStatusBarData:(const StatusBarRawData*)arg1 withActions:(int)arg2;
+ (unsigned int)_publisherPort;
+ (double)getGlowAnimationEndTimeForStyle:(long long)arg1;
+ (void)removeStatusBarItem:(int)arg1;
+ (void)addStatusBarItem:(int)arg1;
+ (void)postDoubleHeightStatusString:(id)arg1 forStyle:(long long)arg2;
+ (void)postGlowAnimationState:(bool)arg1 forStyle:(long long)arg2;
+ (void)removeStyleOverrides:(int)arg1;
+ (void)addStyleOverrides:(int)arg1;
@end

@implementation SDStatusBarOverriderPost8_3

@synthesize timeString;
@synthesize dateString;
@synthesize carrierName;
@synthesize bluetoothConnected;
@synthesize bluetoothEnabled;
@synthesize batteryDetailEnabled;
@synthesize networkType;
@synthesize iPadDateEnabled;
@synthesize iPadGsmSignalEnabled;

- (void)enableOverrides
{
  StatusBarOverrideData *overrides = [UIStatusBarServer getStatusBarOverrideData];
  
  // Set 9:41 time in current localization
  overrides->overrideTimeString = 1;
  strcpy(overrides->values.timeString, [self.timeString cStringUsingEncoding:NSUTF8StringEncoding]);
  
  // Enable 5 bars of mobile (iPhone only)
  if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
    overrides->booloverrideItemIsEnabled[3] = 1;
    overrides->values.boolitemIsEnabled[3] = 1;
    overrides->overrideGsmSignalStrengthBars = 1;
    overrides->values.gsmSignalStrengthBars = 5;
  }
  
  overrides->overrideDataNetworkType = self.networkType != SDStatusBarManagerNetworkTypeWiFi;
  overrides->values.dataNetworkType = self.networkType - 1;
  
  // Remove carrier text for iPhone, set it to "iPad" for the iPad
  NSString *carrierText = self.carrierName;
  if ([carrierText length] <= 0) {
    carrierText = ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) ? @"" : @"iPad";
  }
  overrides->overrideServiceString = 1;
  strcpy(overrides->values.serviceString, [carrierText cStringUsingEncoding:NSUTF8StringEncoding]);
  
  // Battery
  overrides->booloverrideItemIsEnabled[8] = 1;
  overrides->values.boolitemIsEnabled[8] = 1;
  overrides->overrideBatteryDetailString = 1;
  strcpy(overrides->values.batteryDetailString, [self.batteryDetailEnabled ? @"100%" : @" " cStringUsingEncoding:NSUTF8StringEncoding]);
  
  // Bluetooth
  overrides->booloverrideItemIsEnabled[11] = self.bluetoothEnabled;
  overrides->values.boolitemIsEnabled[11] = self.bluetoothEnabled;
  if (self.bluetoothEnabled) {
    overrides->overrideBluetoothConnected = self.bluetoothConnected;
    overrides->values.bluetoothConnected = self.bluetoothConnected;
  }
  
  // Actually update the status bar
  [UIStatusBarServer postStatusBarOverrideData:overrides];
    
  // if battery detail was not required, then it was set to one space @" ", so let's correct it here in case bluetooth icon comes after it
  if (!self.batteryDetailEnabled) {
    strcpy(overrides->values.batteryDetailString, [@"" cStringUsingEncoding:NSUTF8StringEncoding]);
    [UIStatusBarServer postStatusBarOverrideData:overrides];
  }
  
  // Lock in the changes, reset simulator will remove this
  [UIStatusBarServer permanentizeStatusBarOverrideData];
}

- (void)disableOverrides
{
  StatusBarOverrideData *overrides = [UIStatusBarServer getStatusBarOverrideData];
  
  // Remove specific overrides (separate flags)
  overrides->overrideTimeString = 0;
  overrides->overrideGsmSignalStrengthBars = 0;
  overrides->overrideDataNetworkType = 0;
  overrides->overrideBatteryDetailString = 0;
  overrides->overrideBatteryDetailString = 0;
  overrides->overrideBluetoothConnected = 0;
  
  // Remove all overrides that use the array of bools
  for (int i = 0; i < 26; i++) {
    overrides->booloverrideItemIsEnabled[i] = 0;
    overrides->values.boolitemIsEnabled[i] = 0;
  }
  
  // Carrier text (it's an override to set it back to the default)
  overrides->overrideServiceString = 1;
  strcpy(overrides->values.serviceString, [NSLocalizedString(@"Carrier", @"Carrier") cStringUsingEncoding:NSUTF8StringEncoding]);
  
  // Actually update the status bar
  [UIStatusBarServer postStatusBarOverrideData:overrides];
  
  // Have to call this to remove all the overrides
  [UIStatusBarServer permanentizeStatusBarOverrideData];
}

@end
